package com.wb.core1;

/**
 * @author 黄衡熙
 * @version 1.0
 * @date 2025年07月20日11:42
 */
public class Test19_位运算符 {
    public static void main(String[] args) {
        int num1 = 5;
        int num2 = 8;
        //按位与只有1&1时结果为1,否则结果为0
// num1二进制:00000000 00000000 00000000 00000101
// num2二进制:00000000 00000000 00000000 00001000
// 00000000 00000000 00000000 00000000
// 其值即为:0
        System.out.println(num1 & num2);
        //按位或只有0|0时结果为0,否则结果为1
// num1二进制:00000000 00000000 00000000 00000101
// num2二进制:00000000 00000000 00000000 00001000
// 00000000 00000000 00000000 00001101
// 其值即为:1+4+8=13
        System.out.println(num1 | num2);
//按位非原值如果是1则返回0,原值如果是0则返回1
// num1二进制:00000000 00000000 00000000 00000101
// 11111111 11111111 11111111 11111010  补码
// 反码:11111111 11111111 11111111 11111001
// 原码:10000000 00000000 00000000 00000110
// 其值即为:-6
        System.out.println(~num1);

        //异或如果两位相同,则结果为0, 否则结果为1
// num1二进制:00000000 00000000 00000000 00000101
// num2二进制:00000000 00000000 00000000 00001000
// 00000000 00000000 00000000 00001101
// 其值即为:1+4+8=13
        System.out.println(num1 ^ num2);


//左移将二进制的所有位都向左移动指定的位数,高位丢弃,低位补0
// num1二进制:00000000 00000000 00000000 00000101
// 00 00000000 00000000 00000000 00010100
// 其值即为: 4+16 = 20
        System.out.println(num1 << 2);


        //右移将二进制的所有位都向右移动指定的位数,低位丢弃,高位补符号位,正数都补0,负数都补1
// num1二进制:00000000 00000000 00000000 00000101
// 00000000 00000000 00000000 00000001 01
// 其值即为1
        System.out.println(num1 >> 2);

        //无符号右移与右移的区别在于负数的运算,不管正负数,高位均补0
// -8的二进制:10000000 00000000 00000000 00001000
// 在计算机中所有的运算针对的是二进制补码
//      反码:11111111 11111111 11111111 11110111
//      补码:11111111 11111111 11111111 11111000
// 无符号右移2位:00111111 11111111 11111111 11111110 00
// 右移后补码为: 00111111 11111111 11111111 11111110
// 正数的原码与补码一致
// 其值为: 1073741822
        System.out.println(-8 >>> 2);
    }
}
